#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>

// pid_t vfork(void);
int main()
{
    // int a = 100;
    static int a = 100;

    printf("hello %p %d \n", &a, a);

    pid_t pid = vfork();

    if (pid == -1)
    {
        printf("创建进程失败 \n");
    }

    if (pid > 0)
    {
        printf("parent 1 %p %d \n", &a, a);
        int status;
        wait(&status);
        printf("%d %d %d %d\n", WIFEXITED(status), WEXITSTATUS(status), WIFSIGNALED(status), WTERMSIG(status));
    }

    // 子进程
    if (pid == 0)
    {
        printf("child 1 %p %d \n", &a, a);
        sleep(3);
        a = 250;
        printf("child 2 %p %d \n", &a, a);
        exit(10);
    }
    // 子进程结束之后，父进程才开始运行
    // 变量是共享的，所以子进程修改的变量，父进程也能看到
    // vfock和fork的区别就是，vfork创建的子进程会先运行，而fork创建的子进程和父进程是交替运行的
    // vfock创建一个子进程，子进程共享父进程的地址空间（准确来说，在调用exec（进程替换）或exit（退出进程）之前与父进程数据是共享的

    // 特点：
    // 1、子进程共享父进程的地址空间（准确来说，在调用exec（进程替换）或exit（退出进程）之前与父进程数据是共享的）
    // 2、一定是子进程先运行，而且是等子进程结束之后，父进程才开始运行
    // 3、当子进程调用exit之后，父进程才会往下执行
    // 4、你在引用的时候，最好尽快结束子进程
    return 0;
}
